package com.itheima.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 *
 */
//因为不确定这个属于哪个层  所以使用Component注解
@Component
public class MyConnection {
    /**
     * Transaction 事务 Manager 管理
     * 事务管理器 :  封装事务代码
     * 涉及到事务 不可避免的涉及到 DataSource Connection
     * 1.将此类放入spring的容器
     * 2.注入数据源
     * 3.提供方法 提供连接对象
     * 4.提供提交事务并关闭连接的方法
     * 4.提供回滚事务并关闭连接的方法
     */

    //事务一般是在servicez层  但是Connection是dao层的  为了更加的符合三层架构的模式
    //所以Connection不应该出现在service层  所以提供一个工具类  将事务抽取出来

    /**
     * 注入数据源*/
    @Autowired
    private DataSource dataSource;

    /**
     * 定义本地变量存储的对象
     */
    private ThreadLocal<Connection> local = new ThreadLocal<>();

    public Connection getConnection() throws SQLException {

        //先从本地获取  如果本地没有  那么就创建一个  然后将创建的连接放入到Thread中
        Connection connection = local.get();
        //创建一个Connection
        if (connection == null) {
            //获取连接
            connection = dataSource.getConnection();
            //关闭事务的自动提交
            connection.setAutoCommit(false);
            //将获取的线程放入到线程中
            local.set(connection);

        }

        return connection;

    }

    public void commitAndClose () {
        try {
            Connection connection = getConnection();
            connection.commit();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    public void rollbackAndClose () {
        try {
            Connection connection = getConnection();
            connection.commit();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
